using EnvDTE;
using VSSDKAssist.Assets.ValueProviders.Base;

namespace VSSDKAssist.Assets.ValueProviders.VisualStudio
{
	/// <summary>
	/// Value provider for the selected Project
	/// </summary>
	public class CurrentlySelectedProjectValueProvider : ValueProviderBase
	{
		#region Overrides

		/// <summary>
		/// Called when [begin recipe].
		/// </summary>
		/// <param name="currentValue">The current value.</param>
		/// <param name="newValue">The new value.</param>
		/// <returns></returns>
		public override bool OnBeginRecipe(object currentValue, out object newValue)
		{
			newValue = null;

			if((currentValue == null) && (this.ExecutionStage != Stage.OnBeforeActions))
			{
				newValue = GetValue();

				return true;
			}

			return false;
		}

		/// <summary>
		/// Contains code that will be called before actions are executed.
		/// </summary>
		/// <param name="currentValue">An <see cref="T:System.Object"/> that contains the current value of the argument.</param>
		/// <param name="newValue">When this method returns, contains an <see cref="T:System.Object"/> that contains
		/// the new value of the argument, if the returned value
		/// of the method is <see langword="true"/>. Otherwise, it is ignored.</param>
		/// <returns>
		/// 	<see langword="true"/> if the argument value should be replaced with
		/// the value in <paramref name="newValue"/>; otherwise, <see langword="false"/>.
		/// </returns>
		/// <remarks>By default, always returns <see langword="false"/>, unless overridden by a derived class.</remarks>
		public override bool OnBeforeActions(object currentValue, out object newValue)
		{
			newValue = null;

			if((currentValue == null) && (this.ExecutionStage != Stage.OnBeginRecipe))
			{
				newValue = GetValue();

				return true;
			}

			return false;
		}
		#endregion

		#region Private Implementation
		private object GetValue()
		{
			if(VisualStudio.SelectedItems.Count == 1)
			{
				return VisualStudio.SelectedItems.Item(1).Project as Project;
			}

			return null;
		}
		#endregion
	}
}